import subprocess
import sys
import os
import time
import datetime

class Logger(object):

	def __init__(self):
		self.file = open("info.log",'a')

	def log(self, *args):
		ts = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
		for elem in args:
			self.file.write("{0} - {1}".format(ts,elem))
		self.file.write("\n")

	def __del__(self):
		try:
			self.file.close()
		except IOError:
			print "No se pudo cerrar el archivo"
logger = None

if os.getuid() == 0:	# Es el superuser <=> UID = 0
	logger = Logger()

class Http(object):
	def crear(self):
		return Servidor(CadenaComando("apache2"))

class Ftp(object):
	def crear(self):
		return Servidor(CadenaComando("vsftpd"))

class Telnet(object):
	def crear(self):
		return Servidor(CadenaComando("xinetd"))


class Constructor_servidor(object):
	
	def __init__(self):
		self.tipos = {}
		self.tipos["http"] = Http()
		self.tipos["ftp"] = Ftp()
		self.tipos["telnet"] = Telnet()

	def crear_servidor(self,tipo):
		if tipo in self.tipos:
			return self.tipos[tipo].crear()
		return None


class CadenaComando(object):

	def __init__(self, servicio, proximo_comando = None):
		self.servicio = servicio
		self.proximo_comando = proximo_comando
	
	def comenzar_servidor(self):
		try:
			subprocess.check_call("service {0} start".format(self.servicio), shell = True)
			 
		except subprocess.CalledProcessError:
			logger.log("comenzar_servidor", "falla service start", "servicio : {0}".format(self.servicio))
		except OSError:
			logger.log("error de ejecucion del servidor del sistema operativo al comenzar el servidor")
		if self.proximo_comando is not None:
			self.proximo_comando.comenzar_servidor()

	def detener_servidor(self):
		try:
			subprocess.check_call("service {0} stop".format(self.servicio), shell = True)
		except subprocess.CalledProcessError:
			logger.log("comenzar_servidor", "falla service stop", "servicio : {0}".format(self.servicio))
		except OSError:
			logger.log("error de ejecucion del servidor del sistema operativo al detener el servidor")
		
		if self.proximo_comando is not None:
			self.proximo_comando.detener_servidor()


class Servidor(object):
	def __init__(self, comandos):
		self.comandos = comandos

	def comenzar_servidor(self):
		self.comandos.comenzar_servidor()
	def detener_servidor(self):
		self.comandos.detener_servidor()


def levantar_estado():
	with open("estado") as festado:
		linea = festado.readline()
		return linea.strip()

def manejar(servidor, accion, tipo, constructor):
	if accion == "start":
		print "START!"
		if servidor is not None:
			servidor.detener_servidor()	
		servidor = constructor.crear_servidor(tipo)
		servidor.comenzar_servidor()
		print "servidor {0} iniciadio correctamente".format(tipo)
		with open("estado", "w") as festado:
			festado.write(tipo)		
	elif accion == "stop":
		print "STOP!"
		if servidor is None:
			print "el servidor no se encuentra corriendo"
			return
		servidor.detener_servidor()
		with open("estado", "w") as festado:
			festado.write("")
		print "servidor detenido correctamente"

	

seleccion_acciones = {"-h": "http", "-t": "telnet", "-f":"ftp"}

def main():
	import getopt
	if os.getuid() != 0:
		print "Debe ejecutarse como root"
		return 2
	if len(sys.argv) == 1:
		print "Uso correcto \n-h [start|stop] : inicia/detiene un servidor http \n-f [start|stop] : inicia/detiene un servidor ftp \n-t [start|stop] : inicia/detiene un servidor telnet"
		return 1
	valid_args, invalid_args = getopt.getopt(sys.argv[1:], "h:f:t:")
	valid_args = valid_args[:1]
	constructor = Constructor_servidor()
	print "levantar estado = {0}".format(levantar_estado())
	servidor = constructor.crear_servidor(levantar_estado())
	manejar(servidor, valid_args[0][1], seleccion_acciones[valid_args[0][0]], constructor)
	return 0


if __name__ == "__main__":
	main()
